package edu.upc.dao.consulta.impl;

import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import edu.upc.dao.consulta.ConsultaAvisoSolicitanteDao;
import edu.upc.model.Aviso;
import edu.upc.model.Especialidad;
import edu.upc.model.Solicitante;
import edu.upc.web.comun.Constantes;
import edu.upc.web.comun.HelperDate;


@Component
public class ConsultaAvisoSolicitanteDaoImpl implements ConsultaAvisoSolicitanteDao{
	
	@Autowired
	DataSource dataSource;
	
	public List<Aviso> obtenerAvisoSolicitante(Solicitante solicita) {
		
		String sql = "SELECT a.id_avi, a.cargo_avi,a.inicio_avi,a.fin_avi,a.descripcion_avi,a.jornadaLaboral_avi,a.disponibilidad_avi,a.requerimientos_avi,a.beneficios_avi,a.sueldo_avi,a.estado_avi,a.conteoLectura_avi, a.id_Especialidad FROM tb_detalle_aviso_postulante d, tb_aviso a WHERE d.id_avi=a.id_avi AND d.id_per=?";
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		List<Aviso> lst = new ArrayList<Aviso>();
		try {
			conn = dataSource.getConnection();
			ps = conn.prepareStatement(sql);
			ps.setInt(1, solicita.getId());
			rs = ps.executeQuery();
			lst = mapResult(rs);
		} catch (SQLException e) {
			throw new RuntimeException("SQL exception occurred finding avisos by Ofertante", e);
		} finally {
			if (rs != null) {
				try {
					// Close to prevent database cursor exhaustion
					rs.close();
				} catch (SQLException ex) {
				}
			}
			if (ps != null) {
				try {
					// Close to prevent database cursor exhaustion
					ps.close();
				} catch (SQLException ex) {
				}
			}
			if (conn != null) {
				try {
					// Close to prevent database connection exhaustion
					conn.close();
				} catch (SQLException ex) {
				}
			}
		}
		return lst;
		
	}

	private List<Aviso> mapResult(ResultSet rs) throws SQLException {
		List<Aviso> lstAviso=new ArrayList<Aviso>();
		while(rs.next()){
			Aviso aviso = new Aviso();
			aviso.setId(Integer.parseInt(rs.getString("id_avi")));
			aviso.setCargo(rs.getString("cargo_avi"));
			aviso.setFechaInicio(HelperDate.parseaDate(rs.getString("inicio_avi"),Constantes.FORMATO_FECHA));
			aviso.setFechaFin(HelperDate.parseaDate(rs.getString("fin_avi"),Constantes.FORMATO_FECHA));
			aviso.setDescripcion(rs.getString("descripcion_avi"));
			aviso.setJornadaLaboral(rs.getString("jornadaLaboral_avi"));
			aviso.setDisponibilidad(rs.getString("disponibilidad_avi"));
			aviso.setRequerimiento(rs.getString("requerimientos_avi"));
			aviso.setBeneficios(rs.getString("beneficios_avi"));
			aviso.setSueldo(new BigDecimal(rs.getString("sueldo_avi")));
			aviso.setEstado(rs.getString("estado_avi"));
			aviso.setContadorVisitas(rs.getInt("conteoLectura_avi"));
			
			Especialidad especialidad = new Especialidad();
			especialidad.setIdEspecialidad(rs.getInt("id_Especialidad"));
			aviso.setEspecialidad(especialidad);
			lstAviso.add(aviso);
		}

		return lstAviso;
	}

}
